This is an R Markdown
Notebook. When you execute code within the notebook, the results appear
beneath the code.
Try executing this chunk by clicking the Run button within
the chunk or by placing your cursor inside it and pressing
Cmd+Shift+Enter.
library("BiocManager")
Bioconductor version 3.16 (BiocManager 1.30.20), R 4.2.0 (2022-04-22)
Bioconductor version '3.16' is out-of-date; the current release version '3.17' is available with R version '4.3'; see https://bioconductor.org/install
library("ComplexHeatmap")
Warning: package ‘ComplexHeatmap’ was built under R version 4.2.1
Loading required package: grid
========================================
ComplexHeatmap version 2.14.0
Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
Github page: https://github.com/jokergoo/ComplexHeatmap
Documentation: http://jokergoo.github.io/ComplexHeatmap-reference
If you use it in published research, please cite either one:
- Gu, Z. Complex Heatmap Visualization. iMeta 2022.
- Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional
genomic data. Bioinformatics 2016.
The new InteractiveComplexHeatmap package can directly export static
complex heatmaps into an interactive Shiny app with zero effort. Have a try!
This message can be suppressed by:
suppressPackageStartupMessages(library(ComplexHeatmap))
========================================
library("grid")
library("dendsort")
library(circlize)
========================================
circlize version 0.4.15
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/
If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
in R. Bioinformatics 2014.
This message can be suppressed by:
suppressPackageStartupMessages(library(circlize))
========================================
col_fun = colorRamp2(c(-0.5, 0, 0.5), c("red", "white", "blue"))
col_fun(seq(-3, 3))
[1] "#FF0000FF" "#FF0000FF" "#FF0000FF" "#FFFFFFFF" "#0000FFFF" "#0000FFFF" "#0000FFFF"
library(circlize)
========================================
circlize version 0.4.15
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/
If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
in R. Bioinformatics 2014.
This message can be suppressed by:
suppressPackageStartupMessages(library(circlize))
========================================
col_fun = colorRamp2(c(-0.5, 0, 0.5), c("red", "white", "blue"))
col_fun(seq(-3, 3))
[1] "#FF0000FF" "#FF0000FF" "#FF0000FF" "#FFFFFFFF" "#0000FFFF" "#0000FFFF" "#0000FFFF"
corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/AOS screen/r values AOS-genes-screen-imputed.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrData$AOS <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat, cluster_rows = FALSE, column_title = "Antioxidant gene signature (41 genes)",
column_title_side = "bottom", cluster_columns = col_dend, col = col_fun, name = "Pearson correlation \n coefficient")
Heatmap(corrMat, cluster_rows = FALSE, column_title = "NRF2 signature (24 genes)",
column_title_side = "bottom")

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/antioxidant network screen/r values signature screen.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrData$AOS <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat, cluster_rows = FALSE, name = "Pearson correlation \n coefficient",cluster_columns = col_dend, col = col_fun,column_title = "Correlation of antioxidant transcription factor activity \n with RRM2B expression",
column_title_side = "bottom")
corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/AOS screen/r values AOS-genes-screen-imputed.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrData$AOS <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat, cluster_rows = FALSE, column_title = "Antioxidant gene signature (41 genes)",
column_title_side = "bottom", cluster_columns = col_dend, col = col_fun, name = "Pearson correlation \n coefficient")

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/AOS screen/r values AOS-genes-screen-imputed.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat, cluster_rows = FALSE, column_title = "Antioxidant gene signature (41 genes)",
column_title_side = "bottom", cluster_columns = col_dend, col = col_fun, name = "Pearson correlation \n coefficient")

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values signature screen with bach.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
Heatmap(corrMat, cluster_rows = FALSE, name = "Pearson correlation \n coefficient",
column_title = "Correlation of antioxidant transcription factor activity \n with RRM2B expression (with BACH genes)",
column_title_side = "bottom")

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/GSTA4 GSTA1 GSTP1 comparison/r values cancer screen (GSTA4, GSTP1, GSTA1).csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
rn <- rownames(corrMat)
print(rn)
[1] "RRM2B - AOS" "RRM2B - NRF2" "RRM2B - p53" "p53 - NRF2" "p53 - AOS" "p53 - G6PD" "RRM2B - G6PD"
Heatmap(corrMat,
cluster_rows = FALSE,
name = "Pearson correlation \n coefficient",
cluster_columns = col_dend,
col = col_fun)

c_order <- c('HCCDB.1', 'HCCDB.3', 'HCCDB.4', 'HCCDB.8', 'HCCDB.9', 'HCCDB.11',
'HCCDB.12', 'HCCDB.13', 'HCCDB.14', 'HCCDB.16', 'HCCDB.17', 'HCCDB.18',
'ACC', 'BLCA', 'DBLC', 'UCEC', 'SKCM', 'HNSC', 'PRAD', 'KIRP',
'PAAD', 'SARC', 'CESC', 'COAD', 'LUSC', 'READ', 'KIRC', 'LIHC',
'BRCA', 'OV', 'UCS', 'GBM', 'KICH', 'THCA', 'LGG', 'LUAD', 'MESO',
'PCPG', 'TGCT', 'UVM', 'THYM', 'CHOL', 'ESCA', 'STAD', 'LAML', 'PANCAN')
r_order_41 <- c('RRM2B - AOS', 'RRM2B - NRF2 signature', 'RRM2B vs G6PD', 'RRM2B - p53 signature', 'p53 signature vs G6PD', 'NRF2 signature - p53 signature', 'AOS signature - p53 signature')
r_order_125 <- c('RRM2B - Oxidative stress',
'RRM2B - AOS',
'RRM2B - NRF2',
'RRM2B - G6PD',
'RRM2B - p53',
'p53 - G6PD',
'p53 - NRF2',
'p53 - AOS')
r_order_41 <- c('RRM2B - AOS',
'RRM2B - NRF2',
'RRM2B - G6PD',
'RRM2B - p53',
'p53 - G6PD',
'p53 - NRF2',
'p53 - AOS')
corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/without outlier correction NEW/r values cancer screen (final).csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
name = "Pearson correlation \n coefficient",
col = col_fun,
row_order = r_order_125,
column_title = "without outlier correction")

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/outlier corrected/r values cancer screen (final).csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
name = "Pearson correlation \n coefficient",
col = col_fun,
column_order = c_order,
row_order = r_order_125,
column_title = "WITH outlier correction")

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values rrm2b.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
#col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
cluster_columns = FALSE,
name = "Pearson correlation \n coefficient",
col = col_fun)

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
#col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
cluster_columns = FALSE,
name = "Pearson correlation \n coefficient",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO aggregate.csv', header = TRUE)
Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
incomplete final line found by readTableHeader on '/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO aggregate.csv'
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
#col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
cluster_columns = FALSE,
column_title = "RRM2B - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO aggregate.csv', header = TRUE)
Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
incomplete final line found by readTableHeader on '/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO aggregate.csv'
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
#col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
cluster_columns = FALSE,
column_title = "p53 - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO screen pub set.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "RRM2B - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 41 AOS screen.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "RRM2B - 41 AOS",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO screen pub set.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "p53 - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 41 AOS screen.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "p53 - 41 AOS",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO screen v2.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "RRM2B - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO screen v2.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "p53 - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 41 AOS screen v2.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "RRM2B - 41 AOS",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 41 AOS screen v2.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "p53 - 41 AOS",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO screen with average.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "RRM2B - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO screen with average.csv', header = TRUE)
#set specific column as row names
rownames(corrData) <- corrData$database
#remove original column from data frame
corrData$database <- NULL
corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat,
cluster_rows = FALSE,
column_title = "p53 - 125 GO",
column_title_side = "bottom",
name = "r value",
col = col_fun)

{r}
Add a new chunk by clicking the Insert Chunk button on the
toolbar or by pressing Cmd+Option+I.
When you save the notebook, an HTML file containing the code and
output will be saved alongside it (click the Preview button or
press Cmd+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the
editor. Consequently, unlike Knit, Preview does not
run any R code chunks. Instead, the output of the chunk when it was last
run in the editor is displayed.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4KClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLgoKYGBge3J9CmxpYnJhcnkoIkJpb2NNYW5hZ2VyIikKbGlicmFyeSgiQ29tcGxleEhlYXRtYXAiKQpsaWJyYXJ5KCJncmlkIikKbGlicmFyeSgiZGVuZHNvcnQiKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGNpcmNsaXplKQpjb2xfZnVuID0gY29sb3JSYW1wMihjKC0wLjUsIDAsIDAuNSksIGMoInJlZCIsICJ3aGl0ZSIsICJibHVlIikpCmNvbF9mdW4oc2VxKC0zLCAzKSkKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBOUkYyIHNjcmVlbi1pbXB1dGVkLmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yZXN1bHRzL0FPUyBzY3JlZW4vciB2YWx1ZXMgQU9TLWdlbmVzLXNjcmVlbi1pbXB1dGVkLmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTApjb3JyRGF0YSRBT1MgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQpIZWF0bWFwKGNvcnJNYXQsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBjb2x1bW5fdGl0bGUgPSAiQW50aW94aWRhbnQgZ2VuZSBzaWduYXR1cmUgKDQxIGdlbmVzKSIsIAogICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgY2x1c3Rlcl9jb2x1bW5zID0gY29sX2RlbmQsIGNvbCA9IGNvbF9mdW4sIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIpCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvcmVzdWx0cy9BT1Mgc2NyZWVuL3IgdmFsdWVzIEFPUy1nZW5lcy1zY3JlZW4taW1wdXRlZC5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCmNvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKSGVhdG1hcChjb3JyTWF0LCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgY29sdW1uX3RpdGxlID0gIkFudGlveGlkYW50IGdlbmUgc2lnbmF0dXJlICg0MSBnZW5lcykiLCAKICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIGNsdXN0ZXJfY29sdW1ucyA9IGNvbF9kZW5kLCBjb2wgPSBjb2xfZnVuLCBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3Jlc3VsdHMvYW50aW94aWRhbnQgbmV0d29yayBzY3JlZW4vciB2YWx1ZXMgc2lnbmF0dXJlIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKY29yckRhdGEkQU9TIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiLGNsdXN0ZXJfY29sdW1ucyA9IGNvbF9kZW5kLCBjb2wgPSBjb2xfZnVuLGNvbHVtbl90aXRsZSA9ICJDb3JyZWxhdGlvbiBvZiBhbnRpb3hpZGFudCB0cmFuc2NyaXB0aW9uIGZhY3RvciBhY3Rpdml0eSBcbiB3aXRoIFJSTTJCIGV4cHJlc3Npb24iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3Jlc3VsdHMvbnJmMiBoZWF0bWFwL3IgdmFsdWVzIE5SRjIgc2NyZWVuLWltcHV0ZWQuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgY29sdW1uX3RpdGxlID0gIk5SRjIgc2lnbmF0dXJlICgyNCBnZW5lcykiLCAKICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIsY2x1c3Rlcl9jb2x1bW5zID0gY29sX2RlbmQsIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgc2lnbmF0dXJlIHNjcmVlbiB3aXRoIGJhY2guY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKCkhlYXRtYXAoY29yck1hdCwgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIsIAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJDb3JyZWxhdGlvbiBvZiBhbnRpb3hpZGFudCB0cmFuc2NyaXB0aW9uIGZhY3RvciBhY3Rpdml0eSBcbiB3aXRoIFJSTTJCIGV4cHJlc3Npb24gKHdpdGggQkFDSCBnZW5lcykiLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignLy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yZXN1bHRzL0dTVEE0IEdTVEExIEdTVFAxIGNvbXBhcmlzb24vciB2YWx1ZXMgY2FuY2VyIHNjcmVlbiAoR1NUQTQsIEdTVFAxLCBHU1RBMSkuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCnJuIDwtIHJvd25hbWVzKGNvcnJNYXQpCnByaW50KHJuKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgbmFtZSA9ICJQZWFyc29uIGNvcnJlbGF0aW9uIFxuIGNvZWZmaWNpZW50IiwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBjb2xfZGVuZCwgCiAgICAgICAgY29sID0gY29sX2Z1bikKCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgMTI1IEdPIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiTlJGMiBzaWduYXR1cmUgKDI0IGdlbmVzKSIsIAogICAgICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIAogICAgICAgIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gY29sX2RlbmQsIAogICAgICAgIGNvbCA9IGNvbF9mdW4pCgpgYGAKCmBgYHtyfQpjX29yZGVyIDwtIGMoJ0hDQ0RCLjEnLCAnSENDREIuMycsICdIQ0NEQi40JywgICdIQ0NEQi44JywgJ0hDQ0RCLjknLCAnSENDREIuMTEnLCAKICAgICAgICdIQ0NEQi4xMicsICdIQ0NEQi4xMycsICdIQ0NEQi4xNCcsICdIQ0NEQi4xNicsICdIQ0NEQi4xNycsICdIQ0NEQi4xOCcsCiAgICAgICAnQUNDJywgJ0JMQ0EnLCAnREJMQycsICdVQ0VDJywgJ1NLQ00nLCAnSE5TQycsICdQUkFEJywgJ0tJUlAnLAogICAgICAgJ1BBQUQnLCAnU0FSQycsICdDRVNDJywgJ0NPQUQnLCAnTFVTQycsICdSRUFEJywgJ0tJUkMnLCAnTElIQycsCiAgICAgICAnQlJDQScsICdPVicsICdVQ1MnLCAnR0JNJywgJ0tJQ0gnLCAnVEhDQScsICdMR0cnLCAnTFVBRCcsICdNRVNPJywKICAgICAgICdQQ1BHJywgJ1RHQ1QnLCAnVVZNJywgJ1RIWU0nLCAnQ0hPTCcsICdFU0NBJywgJ1NUQUQnLCAnTEFNTCcsICdQQU5DQU4nKQpyX29yZGVyXzQxIDwtIGMoJ1JSTTJCIC0gQU9TJywgJ1JSTTJCIC0gTlJGMiBzaWduYXR1cmUnLCAnUlJNMkIgdnMgRzZQRCcsICdSUk0yQiAtIHA1MyBzaWduYXR1cmUnLCAncDUzIHNpZ25hdHVyZSB2cyBHNlBEJywgJ05SRjIgc2lnbmF0dXJlIC0gcDUzIHNpZ25hdHVyZScsICdBT1Mgc2lnbmF0dXJlIC0gcDUzIHNpZ25hdHVyZScpCnJfb3JkZXJfMTI1IDwtIGMoJ1JSTTJCIC0gT3hpZGF0aXZlIHN0cmVzcycsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gQU9TJywgCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gTlJGMicsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gcDUzJywKICAgICAgICAgICAgICAgICAncDUzIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ3A1MyAtIE5SRjInLAogICAgICAgICAgICAgICAgICdwNTMgLSBBT1MnKQpyX29yZGVyXzQxIDwtIGMoJ1JSTTJCIC0gQU9TJywgCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gTlJGMicsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gcDUzJywKICAgICAgICAgICAgICAgICAncDUzIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ3A1MyAtIE5SRjInLAogICAgICAgICAgICAgICAgICdwNTMgLSBBT1MnKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignLy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yZXN1bHRzL3dpdGhvdXQgb3V0bGllciBjb3JyZWN0aW9uIE5FVy9yIHZhbHVlcyBjYW5jZXIgc2NyZWVuIChmaW5hbCkuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiLCAKICAgICAgICBjb2wgPSBjb2xfZnVuLCAKICAgICAgICByb3dfb3JkZXIgPSByX29yZGVyXzEyNSwKICAgICAgICBjb2x1bW5fdGl0bGUgPSAid2l0aG91dCBvdXRsaWVyIGNvcnJlY3Rpb24iKQoKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy8vVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvcmVzdWx0cy9vdXRsaWVyIGNvcnJlY3RlZC9yIHZhbHVlcyBjYW5jZXIgc2NyZWVuIChmaW5hbCkuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiLAogICAgICAgIGNvbCA9IGNvbF9mdW4sIAogICAgICAgIGNvbHVtbl9vcmRlciA9IGNfb3JkZXIsCiAgICAgICAgcm93X29yZGVyID0gcl9vcmRlcl8xMjUsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIldJVEggb3V0bGllciBjb3JyZWN0aW9uIikKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy8vVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcnJtMmIuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQojY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgbmFtZSA9ICJQZWFyc29uIGNvcnJlbGF0aW9uIFxuIGNvZWZmaWNpZW50IiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignLy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBwNTMuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQojY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgbmFtZSA9ICJQZWFyc29uIGNvcnJlbGF0aW9uIFxuIGNvZWZmaWNpZW50IiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gMTI1IEdPIGFnZ3JlZ2F0ZS5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgojY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIlJSTTJCIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIHA1MyAtIDEyNSBHTyBhZ2dyZWdhdGUuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKI2NvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKCkhlYXRtYXAoY29yck1hdCwgCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJwNTMgLSAxMjUgR08iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgUlJNMkIgLSAxMjUgR08gc2NyZWVuIHB1YiBzZXQuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY29sdW1uX3RpdGxlID0gIlJSTTJCIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gNDEgQU9TIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiUlJNMkIgLSA0MSBBT1MiLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcDUzIC0gMTI1IEdPIHNjcmVlbiBwdWIgc2V0LmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKCmNvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKCkhlYXRtYXAoY29yck1hdCwgCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJwNTMgLSAxMjUgR08iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcDUzIC0gNDEgQU9TIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAicDUzIC0gNDEgQU9TIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gMTI1IEdPIHNjcmVlbiB2Mi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiUlJNMkIgLSAxMjUgR08iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcDUzIC0gMTI1IEdPIHNjcmVlbiB2Mi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAicDUzIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gNDEgQU9TIHNjcmVlbiB2Mi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiUlJNMkIgLSA0MSAgQU9TIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIHA1MyAtIDQxIEFPUyBzY3JlZW4gdjIuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY29sdW1uX3RpdGxlID0gInA1MyAtIDQxIEFPUyIsIAogICAgICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIAogICAgICAgIG5hbWUgPSAiciB2YWx1ZSIsCiAgICAgICAgY29sID0gY29sX2Z1bikKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBSUk0yQiAtIDEyNSBHTyBzY3JlZW4gd2l0aCBhdmVyYWdlLmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKCmNvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKCkhlYXRtYXAoY29yck1hdCwgCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJSUk0yQiAtIDEyNSBHTyIsIAogICAgICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIAogICAgICAgIG5hbWUgPSAiciB2YWx1ZSIsCiAgICAgICAgY29sID0gY29sX2Z1bikKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBwNTMgLSAxMjUgR08gc2NyZWVuIHdpdGggYXZlcmFnZS5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAicDUzIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYCByCntyfQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4K